# 一份『词汇表』（字符串数组） words 和一张『字母表』（字符串） chars。
# 假如你可以用 chars 中的『字母』（字符）拼写出 words 中的某个『单词』（字符串），那么我们就认为你掌握了这个单词。
# 注意：每次拼写时，chars 中的每个字母都只能用一次。
# 返回词汇表 words 中你掌握的所有单词的 长度之和。
#
#  
# 输入：words = ["cat","bt","hat","tree"], chars = "atach"
# 输出：6
# 解释：  可以形成字符串 "cat" 和 "hat"，所以答案是 3 + 3 = 6。
#
# 输入：words = ["hello","world","leetcode"], chars = "welldonehoneyr"
# 输出：10
# 解释： 可以形成字符串 "hello" 和 "world"，所以答案是 5 + 5 = 10。
#
# url：https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters


# 执行用时 : 112 ms 击败了 86.42% 的用户
# 内存消耗 : 14.1 MB 击败了 5.11% 的用户

# 很智障的原因跪了一次...
def countCharacters(words, chars):
    know = 0
    for word in words:
        # 推测是这个 循环里赋值的操作导致内存不理想时
        keep_chars = chars[:]
        for i in word:
            if i in keep_chars:
                # 第一次提交跪在这里了 以为字符串替换是变更原对象的 所以没赋值
                # 于是原字符串没变化的情况下就一直那么循环着...
                keep_chars = keep_chars.replace(i, "", 1)
            else:
                break
        else:
            know += len(word)
    return know


# 复盘 万物皆可哈希表
# 强者的代码触及到了我的智商盲区
# 首先调个包
import collections


def countCharacters_2(words, chars):
    ans = 0
    # Counter类计数器 # Counter({'a': 2, 't': 1, 'c': 1, 'h': 1})
    cnt = collections.Counter(chars)
    for w in words:
        # Counter({'c': 1, 'a': 1, 't': 1})
        c = collections.Counter(w)
        # all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE，如果是返回 True，否则返回 False。
        if all([c[i] <= cnt[i] for i in c]):
            ans += len(w)
    return ans


ans = countCharacters_2(["cat", "bt", "hat", "tree"], "atach")
print(ans)
